﻿using System;
using System.Collections.Generic;
using l1cs.server.model.Instance;

namespace l1cs.server.model
{
    public class L1MobGroupInfo
    {
        private static Logger _log = Logger.getLogger( typeof( L1MobGroupInfo ).FullName );

        private List<L1NpcInstance> _membersList = new List<L1NpcInstance>();

        private L1NpcInstance _leader;

        public L1MobGroupInfo() { }

        public void setLeader( L1NpcInstance npc )
        {
            _leader = npc;
        }

        public L1NpcInstance getLeader()
        {
            return _leader;
        }

        public bool isLeader( L1NpcInstance npc )
        {
            return npc.getId() == _leader.getId();
        }

        private L1Spawn _spawn;

        public void setSpawn( L1Spawn spawn )
        {
            _spawn = spawn;
        }

        public L1Spawn getSpawn()
        {
            return _spawn;
        }

        public void addMember( L1NpcInstance npc )
        {
            if ( npc == null )
            {
                throw new NullReferenceException();
            }

            // 最初のメンバーであればリーダーにする
            if ( _membersList.Count == 0 )
            {
                setLeader( npc );
                // リーダーの再ポップ情報を保存する
                if ( npc.isReSpawn() )
                {
                    setSpawn( npc.getSpawn() );
                }
            }

            if ( !_membersList.Contains( npc ) )
            {
                _membersList.Add( npc );
            }
            npc.setMobGroupInfo( this );
            npc.setMobGroupId( _leader.getId() );
        }

        public int removeMember( L1NpcInstance npc )
        {
            lock ( _membersList )
            {
                if ( npc == null )
                {
                    throw new NullReferenceException();
                }

                if ( _membersList.Contains( npc ) )
                {
                    _membersList.Remove( npc );
                }
                npc.setMobGroupInfo( null );

                // リーダーで他のメンバーがいる場合は、新リーダーにする
                if ( isLeader( npc ) )
                {
                    if ( isRemoveGroup() && _membersList.Count != 0 )
                    { // リーダーが死亡したらグループ解除する場合
                        foreach ( L1NpcInstance minion in _membersList )
                        {
                            minion.setMobGroupInfo( null );
                            minion.setSpawn( null );
                            minion.setreSpawn( false );
                        }
                        return 0;
                    }
                    if ( _membersList.Count != 0 )
                    {
                        setLeader( _membersList[0] );
                    }
                }

                // 残りのメンバー数を返す
                return _membersList.Count;
            }
        }

        public int getNumOfMembers()
        {
            return _membersList.Count;
        }

        private bool _isRemoveGroup;

        public bool isRemoveGroup()
        {
            return _isRemoveGroup;
        }

        public void setRemoveGroup( bool flag )
        {
            _isRemoveGroup = flag;
        }
    }
}
